home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / osrc.arc / FINGERD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-23  |  2.3 KB  |  115 lines

  1. /* Finger server */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "socket.h"
  7. #include "session.h"
  8. #include "proc.h"
  9.  
  10. extern char *Fdir;
  11. static int Sfinger = -1;    /* Prototype socket for service */
  12. void fingerd();
  13. FILE *dir();
  14. char *pathname();
  15.  
  16. /* Start up finger service */
  17. finstart(argc,argv)
  18. int argc;
  19. char *argv[];
  20. {
  21.     struct sockaddr_in lsocket;
  22.     int s;
  23.  
  24.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  25.     chname(Curproc,"Finger listener");
  26.  
  27.     lsocket.sin_family = AF_INET;
  28.     lsocket.sin_addr.s_addr = Ip_addr;
  29.     if(argc < 2)
  30.         lsocket.sin_port = IPPORT_FINGER;
  31.     else
  32.         lsocket.sin_port = atoi(argv[1]);
  33.  
  34.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  35.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  36.     listen(Sfinger,1);
  37.     for(;;){
  38.         if((s = accept(Sfinger,NULLCHAR,(int *)NULL)) == -1)
  39.             break;    /* Service is shutting down */
  40.  
  41.         /* Spawn a server */
  42.         newproc("fingerd",512,fingerd,s,NULL,NULL);
  43.     }
  44. }
  45. void
  46. fingerd(s)
  47. int s;
  48. {
  49.     char user[80];
  50.     FILE *fp;
  51.     struct mbuf *bp;
  52.     char *file,*cp;
  53.     int c;
  54.  
  55.     sockowner(s,Curproc);
  56.     log(s,"open Finger");
  57.     recvline(s,user,80);
  58.     rip(user);
  59.     if(strlen(user) == 0){
  60.         fp = dir(Fdir,0);
  61.         if(fp == NULLFILE)
  62.             usprintf(s,"No finger information available\n");
  63.         else
  64.             usprintf(s,"Known users on this system:\n");
  65.     } else {
  66.         file = pathname(Fdir,user);
  67.         /* Check for attempted security violation (e.g., somebody
  68.          * might be trying to finger "../ftpusers"!)
  69.          */
  70.         if(strncmp(file,Fdir,strlen(Fdir)) != 0){
  71.             fp = NULLFILE;
  72.             usprintf(s,"Invalid user name %s\n",user);
  73.         } else if((fp = fopen(file,READ_TEXT)) == NULLFILE)
  74.             usprintf(s,"User %s not known\n",user);
  75.         free(file);
  76.     }
  77.     while(fp != NULLFILE){
  78.         if((bp = alloc_mbuf(BLKSIZE+1)) == NULLBUF)
  79.             break;
  80.         cp = bp->data;
  81.         while(bp->cnt < BLKSIZE && (c = fgetc(fp)) != EOF){
  82.             switch(c){
  83.             case '\r':
  84.                 continue;
  85.             case '\n':
  86.                 *cp++ = '\r';
  87.                 *cp++ = '\n';
  88.                 bp->cnt += 2;
  89.                 break;
  90.             default:
  91.                 *cp++ = c;
  92.                 bp->cnt++;
  93.                 break;
  94.             }
  95.         }                
  96.         if(bp->cnt != 0){
  97.             if(send_mbuf(s,bp,0,NULLCHAR,0) == -1)
  98.                 break;
  99.         } else {
  100.             free_p(bp);
  101.             break;
  102.         }
  103.     }
  104.     if(fp != NULLFILE)
  105.         fclose(fp);
  106.     close_s(s);
  107.     log(s,"close Finger");
  108. }
  109. fin0()
  110. {
  111.     if(Sfinger != -1)
  112.         close_s(Sfinger);
  113.     Sfinger = -1;
  114. }
  115.